#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N=310;

int edge[N][N];

int dist[N];
int st[N];
int n;
int Prim(int u)
{
	memset(dist,0x3f3f3f3f,sizeof(dist));
	
	dist[u]=0;
	int ret=0;
	for(int i=0;i<=n;i++)
	{
		int t=-1;
		
		for(int j=0;j<=n;j++)
		{
			if(!st[j] && (t==-1 || dist[t]>dist[j]))
			{
				t=j;
			}
		}
		st[t]=1;
		ret+=dist[t];
		for(int j=0;j<=n;j++)
		{
			dist[j]=min(dist[j],edge[t][j]);
		}
	}
	return ret;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>edge[0][i];
		edge[i][0]=edge[0][i];
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>edge[i][j];
	cout<<Prim(0);
	return 0;
}
